package method_references;

import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author mubei
 * @date 2021/11/22
 * @description
 * 方法引用使用的情景
 * 1.当要传递给Lambda的操作   已经有实现了 可以使用方法引用
 * 2.lambda表达式作为函数式接口的实例  所以方法引用 也就是函数式接口
 * 3.使用格式   类/对象::方法
 * 4.具体分为3种情况
 *      1. 对象::非静态方法
 *      2.类::静态方法
 *      3.类::非静态方法
 * 5.方法引用使用要求  接口中的抽象方法形参列表和返回值类型与
 * 方法引用的返回值形参列表和返回值要一致
 */
public class MethodRefTest {



    public static void main(String[] args) {

    }


    /*
     * 情况1  对象::实例方法
     * 放在参数不返回
     * Consumer中的void accept(T t)
     * PrintStream中的void println(T t)
     * */
    @Test()
    public void test1() {
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("北京");

        PrintStream ps = System.out;
        Consumer<String> con2 = System.out::println;
    }


    /*
    * Supplier中的T get()
    * Employee 中的 String getName()
    * */
    @Test()
    public void test2() {
        Employee ah = new Employee(1, "ah", 10000);

        Supplier<String>sup1 = ()->ah.getName();
        System.out.println(sup1.get());


        Supplier<String> sup2 = ah::getName;
        System.out.println(sup2.get());
    }


    /*
    * 静态方法
    * Comparator 中的 int compare(T t1,T t2)
    * Integer中的  int compare(T t1 , T t2)
    * */

    @Test()
    public void test3() {
        Comparator<Integer>com1 = (t1,t2)->Integer.compare(t1,t2);
        System.out.println(com1.compare(12, 21));

        Comparator<Integer>com2 = Integer::compare;
        System.out.println(com1.compare(21,12));
    }


    /*
    * Function R apply(T t)
    * Math  Long round(Double d)
    * */

    @Test()
    public void test4() {
        Function<Double,Long> func1 = d->Math.round(d);
        System.out.println(func1.apply(10.0));

        Function<Double,Long> func2 = Math::round;
        System.out.println(func2.apply(20.0));

    }


    /*
    * 类:: 实例方法
    * Comparator中的int compare(T t1,T t2)
    *String中的 int t1.comparaTo(t2)
    * */
    @Test()
    public void test5() {
        Comparator<String> com1 = (s1,s2)-> s1.compareTo(s2);
        System.out.println(com1.compare("abc", "bcd"));

        // 第一个参数是方法调用者
        Comparator<String> com2 = String :: compareTo;
        System.out.println(com2.compare("abc", "bcd"));

    }

    /*
    * BiPredicate 中的  test(t1 t2)
    * String    t1.equals(t2)
    * */

    @Test()
    public void test6() {
        BiPredicate<String,String> pre1 = (s1,s2)->s1.equals(s2);
        System.out.println(pre1.test("abc", "abc"));

        BiPredicate<String,String> pre2 = String::equals;
        System.out.println(pre2.test("abc", "abc"));
    }

    @Test()
    public void test7() {
        Employee ah = new Employee(1, "ah", 9999);
        Function<Employee,String> func = (e)->e.getName();
        System.out.println(func.apply(ah));

        Function<Employee,String> func2 = Employee::getName;
        System.out.println(func.apply(ah));
    }
}
